#pragma once
#include <string>

namespace SeanNetwork {

// 协议类型
enum class ProtocolType {
    TCP,  // TCP协议
    KCP   // KCP协议
};

// 连接状态
enum class ConnectionState {
    Disconnected,   // 断开连接
    Connecting,     // 正在连接
    Connected,      // 已连接
    Reconnecting,   // 正在重连
    Failed          // 连接失败
};

// 日志级别定义
enum class LogLevel {
    Debug,      // 调试信息
    Info,       // 正常信息
    Warning,    // 警告信息
    Error,      // 错误信息
    Fatal       // 致命错误
};

// 网络错误码
enum class NetworkErrorCode {
    Success,            // 操作成功
    InvalidArgument,    // 无效参数
    ConnectionFailed,   // 连接失败
    ConnectionClosed,   // 连接已关闭
    SendFailed,         // 发送失败
    ReceiveFailed,      // 接收失败
    Timeout,            // 操作超时
    NotInitialized,     // 未初始化
    AlreadyInitialized, // 已经初始化
    OutOfMemory,        // 内存不足
    InternalError       // 内部错误
};

// 网络统计信息
struct NetworkStats {
    uint64_t TotalBytesSent;     // 总发送字节数
    uint64_t TotalBytesReceived; // 总接收字节数
    uint64_t MessagesSent;       // 发送消息数
    uint64_t MessagesReceived;   // 接收消息数
    uint64_t PacketLoss;         // 丢包数
    uint64_t Retransmissions;    // 重传次数
    uint32_t AverageRtt;         // 平均往返时间(ms)
    uint32_t LatestRtt;          // 最近一次往返时间(ms)
};

// 网络库配置选项
struct NetworkConfig {
    // 是否开启自动重连
    bool EnableAutoReconnect = true;
    
    // 是否启用消息池
    bool EnableMessagePool = true;
    
    // TCP发送超时（毫秒）
    uint32_t TcpSendTimeout = 5000;
    
    // TCP接收超时（毫秒）
    uint32_t TcpReceiveTimeout = 5000;
    
    // KCP每次更新间隔（毫秒）
    uint32_t KcpUpdateInterval = 10;
    
    // KCP是否启用快速重传
    bool KcpFastResend = true;
    
    // KCP窗口大小 (32 for LAN, 128 for WAN)
    uint32_t KcpWindowSize = 128;
    
    // KCP最大传输单元
    uint32_t KcpMtu = 1400;
    
    // 日志级别
    LogLevel LogLevel = LogLevel::Info;
    
    // 是否将日志输出到文件
    bool LogToFile = false;
    
    // 日志文件路径，为空时使用默认路径
    std::string LogFilePath = "";
};

} // namespace SeanNetwork 